// 文件管理模块
const db = require('../db/index');
const fs = require("fs");

/**
 * file_name 文件名
 * file_url 文件地址
 * file_size 文件大小
 * upload_person 上传者 
 * upload_time 上传时间
 * download_number 下载次数
 */

// 上传文件 上传文件名是英文名 可以没有newName
// req.files[0].originalname：用户选择上传文件时的原始文件名; req.files[0].filename：服务器上临时保存的文件名，可能已经经过了一些处理
exports.uploadFile = (req,res) => {
  // req.files[0].filename 通常是直接从上传请求中获取的文件名，可能包含原始编码问题
  const oldName = req.files[0].filename;
  // req.files[0].originalname上传文件的原始文件名; 
  // Buffer.from() 方法用于创建一个 Buffer 对象; 第一个参数是原始文件名 req.files[0].originalname; 第二个参数 'latin1' 指定了编码方式
  // Buffer.toString() 方法将 Buffer 对象转换为字符串
  // 上传文件时，文件名可能使用不同编码方式可能导致文件名在某些环境中显示不正确,通过将文件名从 latin1 转换为 utf8，可以确保文件名在任何环境中都能正确显示
  const newName = Buffer.from(req.files[0].originalname, 'latin1').toString('utf8');
  let upload_time = new Date()

  const sql1 = 'select * from files where file_name = ?'
  db.query(sql1, newName, (err, results) =>{
    if (results.length > 1) {
			res.send({
				status: 1,
				message: "文件名已存在"
			})
		} else {
      // renameSync方法同步地将文件从一个路径移动到另一个路径, 但路径相同，即重命名
      fs.renameSync('./public/upload/' + oldName, './public/upload/' + newName)
			const sql = 'insert into files set ?'
      db.query(sql, {
				file_url: `http://127.0.0.1:3007/upload/${newName}`,
				file_name: newName,
				file_size: req.files[0].size * 1 / 1024,
				upload_time,
				download_number: 0
			}, (err, results) => {
				if (err) return res.cc(err)
				res.send({
					status: 0,
					url: 'http://127.0.0.1:3007/upload/' + newName
				})
			})
    }
  })

}

// 绑定上传者 name url(不要带引号)
exports.bindFileAndUser = (req, res) => {
	const {
		name,
		url
	} = req.body
	const sql = 'update files set upload_person = ? where file_url = ?'
	db.query(sql, [name, url], (err, results) => {
		if (err) return res.cc(err)
		res.send({
			status: 0,
			message: '绑定成功'
		})
	})
}

// 更新下载量
exports.updateDownload = (req, res) => {
	const {
		download_number,
		id
	} = req.body
	number = download_number * 1 + 1
	const sql = 'update files set download_number = ? where id = ?'
	db.query(sql, [number, id], (err, results) => {
		if (err) return res.cc(err)
		res.send({
			status: 0,
			message: '下载量增加'
		})
	})
}

// 下载文件
exports.downloadFile = (req, res) => {
	const sql = 'select * from files where id = ?'
	db.query(sql, req.body.id, (err, result) => {
		if (err) return res.cc(err)
		res.send(result[0].file_url)
	})
}

// 获取文件列表
exports.fileList = (req, res) => {
	const sql = 'select * from files '
	db.query(sql, req.body.id, (err, result) => {
		if (err) return res.cc(err)
		res.send(result)
	})
}

// 获取文件列表总数
exports.fileListLength = (req, res) => {
	const sql = 'select * from files '
	db.query(sql, req.body.id, (err, result) => {
		if (err) return res.cc(err)
		res.send({
			length: result.length
		})
	})
}

// 监听换页返回数据 文件列表  limit 10 为我们要拿到数据 offset 我们跳过多少条数据
exports.returnFilesListData = (req, res) => {
	const number = (req.body.pager - 1) * 10
	const sql = `select * from files  ORDER BY upload_time limit 10 offset ${number} `
	db.query(sql, (err, result) => {
		if (err) return res.cc(err)
		res.send(result)
	})
}

// 搜索文件 模糊搜索 
exports.searchFile = (req, res) => {
	const file_name = req.body.file_name
	const sql = `select * from files where file_name like '%${file_name}%' `
	db.query(sql, (err, result) => {
		if (err) return res.cc(err)
		res.send(result)
	})
}

// 删除文件 id file_name（需要带后缀名）
exports.deleteFile = (req, res) => {
	const sql = `delete from files where id = ? `
	db.query(sql, req.body.id, (err, result) => {
		// fs.unlink 是 Node.js 中用于删除文件的一个方法 fs.unlink(path, callback)
		fs.unlink(`./public/upload/${req.body.file_name}`,(err)=>{
			if (err) return res.cc(err)
		})
		if (err) return res.cc(err)
		res.send({
			status: 0,
			message: '删除成功'
		})
	})
}
